题目
18:Coins
总时间限制: 1000ms 内存限制: 65536kB
描述
There are N kinds of coins. Each kind of coins has a value V and a weight W. Tony wants to go traveling. Unfortunately, he can only carry coins of which the total weight is not greater than K. How much total value of coins can he carry at most?
输入
First line: two positive integers N (N <= 100) and K (K <= 1000).
Next N lines: the i-th line two positive integers V and W (V,W <= 1000) indicating the value and the weight of the i-th coin.
输出
One integer indicating the total value of coins at most.
样例输入
3 7
1 2
2 3
4 5
样例输出
5
翻译
题目:硬币
描述:
有N种硬币。每种硬币都有一个值V和一个重量W。托尼想去旅行。不幸的是,他只能携带总重量不超过K的硬币。他最多能携带多少硬币的总价值?
输入:
第一行:两个正整数N(N<=100)和K(K<=1000)。
接下来的N行:第i行是两个正整数V和W(V,W<=1000),表示第i个硬币的值和重量。
输出:
最多一个整数,表示硬币的总价值。
代码
#include <bits/stdc++.h>
#include <windows.h>
using namespace std;
const int N=101;
int n,
k,
v[N],
w[N],
f[N][1010];//几个硬币时,多少重量所能得到的最大价值
void view(){
cout<<“重量: \t”;for(int j=0;j<=k;j++)cout<<j<<“\t”;cout<<endl;
for(int i=0;i<=n;i++){
cout<<i<<" “<<w[i]<<”,“<<v[i]<<”=\t";
for(int j=0;j<=k;j++)cout<<f[i][j]<<“\t”;cout<<endl;
}
cout<<endl;
}
int main(){
freopen(“data.cpp”,“r”,stdin);
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>v[i]>>w[i];
for(int i=1;i<=n;i++)
for(int j=0;j<=k;j++){
cout<<j<<endl;
if(w[i]>j)f[i][j]=f[i-1][j];//重量不够该硬币,最优价值就不取该硬币
else f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i]);//重量够,就是取不取该硬币的最大值。取就是在少该硬币的最优解+该硬币的价值
view();
}
cout<<f[n][k];
return 0;
}
小结
典型的动态规划,背包问题,但是wrong,我想可能时该题的判断有问题。
网上也有人这么说
网上的ac代码:
#include
using namespace std;
int a[1010];
int m,n,w,v;
int main(){
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>w>>v;
for(int j=n;j>=w;j–)//j=n,是数量,错,应该是总重量
a[j]=max(a[j],a[j-w]+v);//j-w也错,应该是j-输入的第二个数(重量)
}
view();
cout<<a[n];//该输出a[m]。
return 0;
}