poj 1742 多重揹包變種 對時間要求特別嚴格

2021-06-18 06:09:37 字數 1710 閱讀 6049

1 多重揹包物品二進位制拆分後01揹包#include #include #include using namespace std;

#define max_v (100+1)

#define max_f (100000+1)

int a[max_v],c[max_v];

int value[max_f];

bool f[max_f];

int n,m;

#define printf //

int main()

for(int i=1;i<=n;i++)

int cnt = 0;

//binary拆分物品

//c數量 a價值

for(int i=1;i<=n;i++)

if(tc > 0)

}memset(f,0,sizeof(f));

f[0]=true;

for(int i=0;ivalue[i];v--)

for(int v=m;v>=value[i];v--)

}int sums = 0;

for(int v=m;v>0;v--)

if(f[v])

cout<2 按照之前網上說的思路嘗試優化,但依然不理想,依然tle.

#include #include #include using namespace std;

#define max_v (100+1)

#define max_f (100000+1)

int a[max_v],c[max_v];

int value[max_f];

bool f[max_f]; //f[v]為使用i能否達到v

int n,m;

#define printf //

int main()

for(int i=1;i<=n;i++)

memset(f,0,sizeof(f));

f[0]=true;

int maxv = 0;

int sum = 0;

for(int i=1;i<=n;i++)}}

}// int sums = 0;

// for(int v=m;v>0;v--)

//

// }

cout<

混合 完全揹包和01揹包優化解決多重揹包問題

如果乙個物品的value*amount >= m時,則認為此物品可以取任意多件,因為在物品的件數限制amount內,一定可以滿足m了。

#include #include #include using namespace std;

#define max_v (100+1)

#define max_f (100000+1)

int a[max_v],c[max_v];

bool f[max_f];

int n,m;

#define printf //

void zeroonepack(int value)

}void completepack(int value)

void multipack(int value,int amount)

//這段對某些可以應用完全揹包的物品,進行完全揹包才最終ac的。

int k=1;

while(k0;v--)

if(f[v])

cout<

POJ 1742多重揹包問題

include include include include includeusing namespace std define maxn 105 define maxl 100005 int weight maxn c maxn f maxl user maxl int main printf ...

poj 1742 多重揹包(單調佇列)

如題 又是這道題 第一種方法是二進位制拆分多重揹包 能過hdu2488 見我這一篇 第二種是為了減小時間複雜度,通過改變dp策略 能過poj1742 不能過杭電 這裡說第三種,多重揹包的0 vn 複雜度演算法。使用了單調佇列。這位大牛寫的很清楚 也就是找出狀態轉移方程中的重複狀態,然後將容量拆成v拆...

POJ1742 動態規劃 多重揹包

題意 問多重部分和能否恰好等於m。思路 dp i j 用前i種面額硬幣湊成j後,第i種硬幣最多剩下的個數,若湊不成則為 1.可優化空間複雜度。反思 想不出應該如此定義dp陣列。include using namespace std int a 100 10 int c 100 10 int dp 1...