這題多加了菜品必選編號,所以剛開始不知道怎麼寫,原來就把必選的處理下就行了,因為有重複,但是相同的價值與**都一樣,所以這裡就直接挑出來就行了。
把不是必選的在裡面用dp即可,dp之前也要把重複的捨去。
因為總**容量為浮點數,所以先乘以10變成整數就可以用01揹包了。
#include #include #include #include #include #include #include #include #include #include #include #include #define pi acos(-1.0)
#define mem(a,b) memset(a,b,sizeof(a))
#define sca(a) scanf("%d",&a)
#define sc(a,b) scanf("%d%d",&a,&b)
#define pri(a) printf("%d\n",a)
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define mm 204
#define mn 1008
#define inf 2000000000
#define eps 1e-8
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int dp[1005];
int n,k,i,j,v,a,b,p[1005],w[1003],p1[1005],w1[1003];
int vis[1005],kind[1005],sum,cnt;
int main()
for(i=1; i<=n; i++)
if(kind[i]&&!vis[kind[i]])
vis[kind[i]]=1,p1[++cnt]=p[i],w1[cnt]=w[i];
for(i=1; i<=cnt; i++)
for(j=v; j>=p1[i]; j--)
dp[j]=max(dp[j],dp[j-p1[i]]+w1[i]);
cout<
wikioi 1014 裝箱問題 揹包)
有乙個箱子容量為v 正整數,0 v 20000 同時有n個物品 0 n 30 每個物品有乙個體積 正整數 要求n個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。乙個整數v,表示箱子容量 乙個整數n,表示有n個物品 接下來n個整數,分別表示這n 個物品的各自體積 乙個整數,表示箱子剩餘空間。1 ...
wikioi 3130 CYD刷題 揹包)
下午,cyd要刷題了,已知cyd有n題可刷,但他只有m分鐘的時間,而且他的智慧型值為q,也就是說他只能做出難度小於等於q的題目。已知每題可得積分ai,需花費時間bi,難度為ci,問cyd最多可得多少積分。n m q ai bi ci 可得最多積分 4 20 10 20 3 7 30 7 9 30 1...
01揹包變式 要求恰好裝滿的01揹包
ktv裡面有n首歌曲你可以選擇,每首歌曲的時長都給出了.對於每首歌曲,你最多只能唱1遍.現在給你乙個時間限制t t 10 9 問你在最多t 1秒的時間內可以唱多少首歌曲num 且最長唱歌時間是多少time time必須 t 1 最終輸出num 1 和 time 678 即可.注意 你需要優先讓歌曲數...