http://acm.hdu.edu.cn/showproblem.php?pid=2602
题意:
第一行输入测试数据,第二行物品数,背包容量;
第三行物品体积,第四行物品价值。
0/1背包的基础类型题目,可以一试。但是贪心策略不知道哪里出错了。
AC Code(0/1背包):
#include<stdio.h> #include<cstring> #include<algorithm> using namespace std; const int MYDD=1103; struct Q { int w;//价值 int v;//体积 } bone[MYDD]; int MAX(int x,int y) { return x>y? x:y; } int main() { int TT; scanf("%d", &TT); while(TT--) { int dp[MYDD]; int N, V; scanf("%d%d", &N, &V); for(int j = 0; j < N; j++) { scanf("%d", &bone[j].w); } for(int j = 0; j < N; j++) { scanf("%d", &bone[j].v); } memset(dp, 0, sizeof(dp)); for(int j = 0; j < N; j++) { for(int k = V; k >= bone[j].v; k--) { dp[k]=MAX(dp[k], dp[k - bone[j].v] + bone[j].w); } } printf("%d\n",dp[V]); } return 0; } /* By:Shyazhut */ Code2(贪心,待AC): #include<stdio.h> #include<cstring> #include<algorithm> using namespace std; const int MYDD=1103; struct Q { int w;//价值 int v;//体积 } bone[MYDD]; bool cmp(Q x,Q y) { if(x.w != y.w) return x.w > y.w; return x.v < y.v; } int main() { int TT; scanf("%d", &TT); while(TT--) { int N, V; scanf("%d%d", &N, &V); for(int j = 0; j < N; j++) { scanf("%d", &bone[j].w); } for(int j = 0; j < N; j++) { scanf("%d", &bone[j].v); } sort(bone, bone+N, cmp);//贪心策略 int ans = 0; for(int j = 0; j < N; j++) { if(bone[j].v <= V) { ans += bone[j].w; V -= bone[j].v; } } printf("%d\n", ans); } return 0; } /* By:Shyazhut */