刷題——Dollar Dayz POJ - 3181
/*
n元錢在一個有1-k元的店裏買東西,每樣東西都是無限的,問有多少種購買方法
dp[i][j]表示i元錢買1-j東西的方法數,畫個圖很容易發現:
dp[i][j]={
dp[i][j]=dp[i-1][j]:i<j
dp[i][j]=dp[i-1][j]+dp[i][j-i]
}
題目數據比較大,n=1000,k=100時答案有30多位轉換成大數求解
*/
#include <stdio.h>
#include <string.h>
#define ll long long
char dp[105][1005][50];
int sz(char c){
if(c)return c-'0';
return 0;
}
int main(){
int n,k;
while(~scanf("%d %d",&n,&k)){
memset(dp,0,sizeof(dp));
for(int i=0;i<=k;i++){
dp[i][0][0]='1';
}
for(int i=1;i<=k;i++){
for(int j=1;j<=n;j++){
if(j>=i){
int jw=0;
for(int d=0;dp[i-1][j][d]||dp[i][j-i][d];d++)
{
int a=sz(dp[i-1][j][d]),b=sz(dp[i][j-i][d]);
int temp=(a+b+jw)/10;
dp[i][j][d]=(a+b+jw)%10+'0';
jw=temp;
}
if(jw){
dp[i][j][strlen(dp[i][j])]=jw+'0';
}
}
else{
for(int d=0;dp[i-1][j][d];d++)
dp[i][j][d]=dp[i-1][j][d];
}
}
}
for(int i=strlen(dp[k][n])-1;i>=0;i--){
printf("%c",dp[k][n][i]);
}
printf("\n");
}
return 0;
}
n元錢在一個有1-k元的店裏買東西,每樣東西都是無限的,問有多少種購買方法
dp[i][j]表示i元錢買1-j東西的方法數,畫個圖很容易發現:
dp[i][j]={
dp[i][j]=dp[i-1][j]:i<j
dp[i][j]=dp[i-1][j]+dp[i][j-i]
}
題目數據比較大,n=1000,k=100時答案有30多位轉換成大數求解
*/
#include <stdio.h>
#include <string.h>
#define ll long long
char dp[105][1005][50];
int sz(char c){
if(c)return c-'0';
return 0;
}
int main(){
int n,k;
while(~scanf("%d %d",&n,&k)){
memset(dp,0,sizeof(dp));
for(int i=0;i<=k;i++){
dp[i][0][0]='1';
}
for(int i=1;i<=k;i++){
for(int j=1;j<=n;j++){
if(j>=i){
int jw=0;
for(int d=0;dp[i-1][j][d]||dp[i][j-i][d];d++)
{
int a=sz(dp[i-1][j][d]),b=sz(dp[i][j-i][d]);
int temp=(a+b+jw)/10;
dp[i][j][d]=(a+b+jw)%10+'0';
jw=temp;
}
if(jw){
dp[i][j][strlen(dp[i][j])]=jw+'0';
}
}
else{
for(int d=0;dp[i-1][j][d];d++)
dp[i][j][d]=dp[i-1][j][d];
}
}
}
for(int i=strlen(dp[k][n])-1;i>=0;i--){
printf("%c",dp[k][n][i]);
}
printf("\n");
}
return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.